<?php

App::import('Sanitize');

class LocalidadesController extends AppController {

    var $name = 'Localidades';
    var $paginate = array(
        'order' => array('Localidade.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //parent::beforeFilter();
    }

    function index($provincia_id = null, $departamento_id = null, $localidade_id = null) {
        $this->__aux_index($provincia_id, $departamento_id, $localidade_id);
    }

    function admin_index($provincia_id = null, $departamento_id = null, $localidade_id = null) {
        $this->__aux_index($provincia_id, $departamento_id, $localidade_id);
    }

    /**
     * Lista todas las localidades, junto con el departamento y la provincia a la cual pertenece cada localidad
     */
    function __aux_index($provincia_id = null, $departamento_id = null, $localidade_id = null) {

        $this->Localidade->recursive = 0;
        $this->paginate['fields'] = array('Localidade.id', 'Localidade.nombre', 'Localidade.departamento_id', 'Dpto.id', 'Dpto.nombre', 'Provincia.id', 'Provincia.nombre');
        $this->paginate['joins'] = array(
            array(
                'table' => '"departamentos"',
                'type' => 'INNER',
                'alias' => 'Dpto',
                'conditions' => array(
                    'Dpto.id=Localidade.departamento_id'
                )
            ),
            array(
                'table' => '"provincias"',
                'type' => 'INNER',
                'alias' => 'Provincia',
                'conditions' => array(
                    'Provincia.id=Dpto.provincia_id'
                )
            )
        );
        $this->paginate['order'] = array('Provincia.nombre', 'Dpto.nombre', 'Localidade.nombre');
        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $provincias['0'] = 'Todas';
        $provincia_id = (!empty($provincia_id)) ? $provincia_id : '';

        $departamentos = array();
        $departamento_id = (!empty($departamento_id)) ? $departamento_id : '';

        $lista_localidades = array();
        $localidade_id = (!empty($localidade_id)) ? $localidade_id : '';
        $nombre = '';

        if (!empty($provincia_id)) {
            $this->data['Localidade']['provincia_id'] = $provincia_id;
            $departamentos = $this->Localidade->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id),
                        'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
            $departamentos[0] = 'Todos';
            $departamento_id = (!empty($departamento_id)) ? $departamento_id : '0';
        }

        if (!empty($departamento_id)) {
            $this->data['Localidade']['departamento_id'] = $departamento_id;
            $lista_localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $departamento_id),
                        'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
            $lista_localidades[0] = 'Todas';
            $localidade_id = (!empty($localidade_id)) ? $localidade_id : '0';
        }

        if (!empty($localidade_id))
            $this->data['Localidade']['localidade_id'] = $localidade_id;

        $condiciones = array();
        //si vienen datos del filtro
        if (!empty($this->data)) {

            if (isset ($this->data['Localidade']['provincia_id']) && !empty($this->data['Localidade']['provincia_id'])) {
                $condiciones[] = "Provincia.id = {$this->data['Localidade']['provincia_id']}";
            }

            if (isset ($this->data['Localidade']['provincia_id']) && (!empty($this->data['Localidade']['provincia_id']) || ($this->data['Localidade']['provincia_id'] == '0'))) {
                $provincia_id = $this->data['Localidade']['provincia_id'];
                $this->Session->write('provincia_id', $provincia_id);
            }

            if (isset($this->data['Localidade']['departamento_id']) && !empty($this->data['Localidade']['departamento_id'])) {
                $condiciones[] = "Dpto.id = {$this->data['Localidade']['departamento_id']}";
            }

            if ((isset($this->data['Localidade']['departamento_id'])) && (!empty($this->data['Localidade']['departamento_id']) || ($this->data['Localidade']['departamento_id'] == '0'))) {
                $departamento_id = $this->data['Localidade']['departamento_id'];
                if (!empty($this->data['Localidade']['provincia_id'])) {
                    $departamentos = $this->Localidade->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $this->data['Localidade']['provincia_id']),
                                'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                } else {
                    $departamentos = $this->Departamento->find('list', array('fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                }
                $departamentos[0] = 'Todos';
                $this->Session->write('departamento_id', $departamento_id);
                $this->Session->write('departamentos', $departamentos);
            }

            if (isset($this->data['Localidade']['localidade_id']) && !empty($this->data['Localidade']['localidade_id'])) {
                $condiciones[] = "Localidade.id = {$this->data['Localidade']['localidade_id']}";
            }

            if ((isset($this->data['Localidade']['localidade_id'])) && (!empty($this->data['Localidade']['localidade_id']) || ($this->data['Localidade']['localidade_id'] == '0'))) {
                $localidade_id = $this->data['Localidade']['localidade_id'];
                if (!empty($this->data['Localidade']['departamento_id'])) {
                    $lista_localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $this->data['Localidade']['departamento_id']),
                                'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
                } else {
                    $lista_localidades = $this->Localidade->find('list', array('fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
                }
                $lista_localidades[0] = 'Todas';
                $this->Session->write('localidade_id', $localidade_id);
                $this->Session->write('lista_localidades', $lista_localidades);
            }

            if (isset ($this->data['Localidade']['nombre']) && !empty($this->data['Localidade']['nombre'])) {
                $localidad = utf8_encode(strtolower(utf8_decode(trim($this->data['Localidade']['nombre']))));
                $condiciones[] = "lower(Localidade.nombre) LIKE '%{$localidad}%'";
                $nombre = $this->data['Localidade']['nombre'];
                $this->Session->write('nombre', $nombre);
            }

            $this->Session->write('localidades_filter', $condiciones);
        } elseif ($this->Session->check('localidades_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('localidades_filter');
                $provincia_id = ($this->Session->check('provincia_id')) ? $this->Session->read('provincia_id') : '';
                $departamento_id = ($this->Session->check('departamento_id')) ? $this->Session->read('departamento_id') : '';
                $departamentos = ($this->Session->check('departamentos')) ? $this->Session->read('departamentos') : array();
                $localidade_id = ($this->Session->check('localidade_id')) ? $this->Session->read('localidade_id') : '';
                $lista_localidades = ($this->Session->check('lista_localidades')) ? $this->Session->read('lista_localidades') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('localidades_filter');
                $this->Session->delete('provincia_id');
                $this->Session->delete('departamento_id');
                $this->Session->delete('departamentos');
                $this->Session->delete('localidade_id');
                $this->Session->delete('lista_localidades');
                $this->Session->delete('nombre');
            }
        }

        $referer = $this->referer();

        $this->paginate['conditions'] = $condiciones;
        $this->set(compact('provincias', 'provincia_id', 'departamento_id', 'departamentos', 'localidade_id', 'lista_localidades', 'nombre', 'referer'));
        $this->set('localidades', $this->paginate());
        $this->render('index');
    }

    function delete($id = null) {
        $this->__aux_delete($id);
    }

    function admin_delete($id = null) {
        $this->__aux_delete($id);
    }

    /**
     * Permite eliminar una localidad seleccionada si no existen obras de arte que pertenecen a esa localidad
     * @param <type> $id
     */
    function __aux_delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Localidad inválida', true), 'flash_failure');
        } else {
            // Chequeo que la localidad exista
            $localidad = $this->Localidade->find('all', array('conditions' => array('Localidade.id' => $id)));
            if (!empty($localidad)) {
                $localidad_name = $localidad[0]['Localidade']['nombre'];
                // Chequeo si hay obras de arte que pertenecen a esa localidad
                $obras = $this->Obra->find('all', array('conditions' => array('Obra.localidade_id' => $id)));
                if (!empty($obras)) {
                    $this->Session->setFlash(__('La localidad "' . $localidad_name . '" no se puede eliminar porque existen obras de arte que pertenecen a dicha localidad.', true), 'flash_failure');
                } else {
                    if ($this->Localidade->delete($id)) {
                        $this->Session->setFlash(__('La localidad "' . $localidad_name . '" se eliminó correctamente.', true), 'flash_success');
                    } else {
                        $this->Session->setFlash(__('La localidad no se pudo eliminar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                }
            } else {
                $this->Session->setFlash(__('Localidad inválida', true), 'flash_failure');
            }
        }
        $this->redirect(array('action' => 'admin_index'));
    }

    function add($provincia_id = null, $departamento_id = null) {
        $this->__aux_add($provincia_id, $departamento_id);
    }

    function admin_add($provincia_id = null, $departamento_id = null) {
        $this->__aux_add($provincia_id, $departamento_id);
    }

    /**
     * Permite dar de alta una nueva localidad
     */
    function __aux_add($provincia_id = null, $departamento_id = null) {
        $provincia_id = (empty($provincia_id)) ? 0 : $provincia_id;
        $departamento_id = (empty($departamento_id)) ? null : $departamento_id;
        $departamentos = array();
        if (!empty($this->data)) {
            $localidad_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Localidade']['nombre']))));
            $departamento_id = trim($this->data['Localidade']['departamento_id']);
            $provincia_id = trim($this->data['Provincia']['provincia_id']);
            if (!empty($localidad_name)) {
                // Chequeo si existe en la db una localidad con el mismo nombre y que pertenezca al mismo departamento
                $localidad = $this->Localidade->find('all', array('conditions' => array('lower(Localidade.nombre)' => $localidad_name, 'Localidade.departamento_id' => $departamento_id)));

                if (empty($localidad)) {
                    $this->Localidade->create();
                    if ($this->Localidade->save($this->data)) {
                        $localidade_id = $this->Localidade->id;
                        $this->Session->setFlash(__('La localidad se guardó correctamente.', true), 'flash_success');
                        $this->redirect(array('action' => 'admin_index', $provincia_id, $departamento_id, $localidade_id));
                    } else {
                        $this->Session->setFlash(__('La localidad no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                } else {
                    $departamento = $this->Localidade->Departamento->find('all', array('conditions' => array('Departamento.id' => $departamento_id)));
                    $departamento_name = $departamento[0]['Departamento']['nombre'];
                    $this->Session->setFlash(__('La localidad "' . $this->data['Localidade']['nombre'] . '" del departamento "' . $departamento_name . '" ya existe.', true), 'flash_failure');
                }
            } else {
                $this->Session->setFlash(__('El nombre de la localidad no puede ser vacio. Por favor, intente nuevamente.', true), 'flash_failure');
            }
        } elseif (!empty($provincia_id) && empty($departamento_id)) {
            $departamentos = $this->Localidade->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
            $departamento_id = 0;
        } elseif (!empty($provincia_id) && !empty($departamento_id)) {
            $departamentos = $this->Localidade->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        }
        $referer = $this->referer();
        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $this->set(compact('provincias', 'provincia_id', 'departamentos', 'departamento_id', 'referer'));
        $this->render('add');
    }

    function edit($id = null) {
        $this->__aux_edit($id);
    }

    function admin_edit($id = null) {
        $this->__aux_edit($id);
    }

    /**
     * Permite editar una localidad existente
     */
    function __aux_edit($id = null) {
        $provincia_id = '';
        $departamento_id = '';
        $departamentos = array();

        if (!empty($this->data)) {
            $localidad_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Localidade']['nombre']))));
            $departamento_id = $this->data['Localidade']['departamento_id'];
            $provincia_id = $this->data['Provincia']['provincia_id'];
            $id = $this->data['Localidade']['id'];

            // Chequeo si existe en la db una localidad con el mismo nombre y que pertenezca al mismo departamento
            $localidad = $this->Localidade->find('all', array('conditions' => array("Localidade.id <>" => $id, 'lower(Localidade.nombre)' => $localidad_name, 'Localidade.departamento_id' => $departamento_id)));
            if (empty($localidad)) {
                if ($this->Localidade->save($this->data)) {
                    $this->Session->setFlash(__('La localidad se guardó correctamente.', true), 'flash_success');
                    $this->redirect(array('action' => 'admin_index', $provincia_id, $departamento_id, $id));
                } else {
                    $this->Session->setFlash(__('La localidad no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $departamento = $this->Localidade->Departamento->find('all', array('conditions' => array('Departamento.id' => $departamento_id)));
                $departamento_name = $departamento[0]['Departamento']['nombre'];
                $this->Session->setFlash(__('La localidad "' . $this->data['Localidade']['nombre'] . '" del departamento "' . $departamento_name . '" ya existe.', true), 'flash_failure');
            }
        }elseif (empty($id) && empty($this->data)) {
            $this->Session->setFlash(__('Localidad inválida', true), 'flash_failure');
            $this->redirect(array('action' => 'admin_index'));
        } elseif (empty($this->data)) {
            $this->data = $this->Localidade->read(null, $id);
            $provincia_id = $this->data['Departamento']['provincia_id'];
            $departamento_id = $this->data['Localidade']['departamento_id'];
            $departamentos = $this->Localidade->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id), 'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        }
        $referer = $this->referer();
        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $this->set(compact('provincias', 'provincia_id', 'departamentos', 'departamento_id', 'referer'));
        $this->render('edit');
    }

    function view_departamentos($provincia_id = null) {
        $this->__aux_view_departamentos($provincia_id);
    }

    function admin_view_departamentos($provincia_id = null) {
        $this->__aux_view_departamentos($provincia_id);
    }

    /**
     * Buscar todos los departamentos de una determinada provincia
     * @param <type> $provincia_id
     */
    function __aux_view_departamentos($provincia_id = null) {
        $this->layout = false;
        $departamentos = array();
        if (!empty($provincia_id)) {
            $departamentos = $this->Localidade->Departamento->find('list', array(
                        'conditions' => array('Departamento.provincia_id' => $provincia_id),
                        'fields' => array('Departamento.id', 'Departamento.nombre'),
                        'order' => 'Departamento.nombre'
                            )
            );
        }
        $this->set(compact('departamentos', 'provincia_id'));
        $this->render('view_departamentos');
    }

    function view_departamentos_filtro($provincia_id = null) {
        $this->__aux_view_departamentos_filtro($provincia_id);
    }

    function admin_view_departamentos_filtro($provincia_id = null) {
        $this->__aux_view_departamentos_filtro($provincia_id);
    }

    /**
     * Busca los departamentos de una determinada provincia o todos los departamentos
     * @param <type> $provincia_id
     */
    function __aux_view_departamentos_filtro($provincia_id = null) {
        $this->layout = false;
        $departamentos = array();
        if (!empty($provincia_id)) {
            $departamentos = $this->Localidade->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id),
                        'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        } else {
            $departamentos = $this->Departamento->find('list', array('fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        }
        $departamentos[0] = 'Todos';
        $this->set(compact('departamentos', 'provincia_id'));
        $this->render('view_departamentos_filtro');
    }

    function view_localidades_filtro($departamento_id = null) {
        $this->__aux_view_localidades_filtro($departamento_id);
    }

    function admin_view_localidades_filtro($departamento_id = null) {
        $this->__aux_view_localidades_filtro($departamento_id);
    }

    /**
     * Busca las localidades de un determinado departamento o todas las localidades
     * @param <type> $id_departamento
     */
    function __aux_view_localidades_filtro($departamento_id = null) {
        $this->layout = false;
        $lista_localidades = array();

        if (!empty($departamento_id)) {
            $lista_localidades = $this->Localidade->find('list', array('conditions' => array('Localidade.departamento_id' => $departamento_id),
                        'fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
        } else {
            $lista_localidades = $this->Localidade->find('list', array('fields' => array('Localidade.id', 'Localidade.nombre'), 'order' => 'Localidade.nombre'));
        }
        $lista_localidades[0] = 'Todas';
        $this->set(compact('departamento_id', 'lista_localidades'));
        $this->render('view_localidades_filtro');
    }

}
?>